class Main extends egret.DisplayObjectContainer {
    private uiIndex: number;//当前界面的编号

    public constructor() {
        super();
        this.uiIndex = -1;
        // 更新当天属于当年的第多少周，然后更新存储当周分数的key
        GlobalData.updateWeekScoreKey();
        GameConfig.stageWidth = egret.MainContext.instance.stage.stageWidth;
        GameConfig.stageHeight = egret.MainContext.instance.stage.stageHeight;
        this.loadFont();
        // 添加消息监听
        this.init();
    }
    /**
     * 加载组成分数的0-9数字图片
     */
    private loadFont() {
        if(GlobalData.textureArr.length>=10){
            return;
        }
        // 加载0-9的分数的图片
        let imageLoader = new egret.ImageLoader();
            imageLoader.addEventListener(egret.Event.COMPLETE, (event: egret.Event) => {
                let imageLoader = <egret.ImageLoader>event.currentTarget;
                let bgtexture = new egret.Texture();
                bgtexture._setBitmapData(imageLoader.data);
                GlobalData.textureArr.push(bgtexture);
                this.loadFont();
            }, this);
        imageLoader.load("resource/assets/font/score"+GlobalData.textureArr.length+".png");

    }
    /**
     * 初始化监听主域发送过来的消息
     */
    private init() {
        wx.onMessage(data => {
            // update_index没做特别处理
            let pageIndex = data["uiIndex"];
            this.uiIndex = pageIndex;
            let status:string = data["status"];
            if(data["gameName"]){
                GlobalData.gameName = data["gameName"];
            }
            // 如果status未空，为未知命令，不处理
            if(!status){return;}
            // 更新当天属于当年的第多少周，然后更新存储当周分数的key
            GlobalData.updateWeekScoreKey();
            // 展示排行榜页面
            if(status == GameConfig.shareCavansCommand.SHOW_RANK){
                // 展示页面对应UI的排行榜
                this.showPage(pageIndex,data);
            }
            else if(status == GameConfig.shareCavansCommand.PRE_PAGE_RANK){
                // 展示页面对应UI的排行榜
                this.changePage(pageIndex,-1);
            }
            else if(status == GameConfig.shareCavansCommand.NEXT_PAGE_RANK){
                // 展示页面对应UI的排行榜
                this.changePage(pageIndex,1);
            }
            else if(status == GameConfig.shareCavansCommand.CLEAN_RANK){
                // 清空排行榜数据及页面
                this.cancelGame();
            } else if (data["status"] == GameConfig.shareCavansCommand.GET_FRIEND_INFO) {
                // 获取所有朋友关系链里的数据
               GlobalData.getAllFriendData(data["mine"]);
            }else if (data["status"] == GameConfig.shareCavansCommand.UPDATE_INDEX) {
                // 更新了index，当前正在展示的index与现状更新的index不一致，则清空数据不展示内容
                if(this.currentShowPanel && this.currentShowPanel.index != pageIndex){
                    this.cancelGame();
                }
            }
        });
    }
    /**
     * 展示某些页面
     * @param index:页面index，与GameConfig.uiIndex的内容对应
     * @param data:从主域穿过来的原始数据
     */
    // 当前展示的panel
    private currentShowPanel:BasePanel = null;
    private showPage(index:number,data:any)
    {
        // 清空之前的展示
        if(this.currentShowPanel && this.currentShowPanel.index != index){
            if(this.currentShowPanel.parent){
                this.currentShowPanel.parent.removeChild(this.currentShowPanel);
            }
            this.currentShowPanel = null;
        }
        

        // 通过index来加载不同的页面
        if(index == GameConfig.uiIndex.rankListFromHome || index == GameConfig.uiIndex.rankListFromOver)
        {
            let rankListPanel = new RankListPanel(data,index);
            rankListPanel.width = this.width;
            rankListPanel.height = this.height;
            this.addChild(rankListPanel);
            this.currentShowPanel = rankListPanel;
        }
        else if(index == GameConfig.uiIndex.over){
            let gameOverPanel = new GameOverPanel(data,index);
            gameOverPanel.width = this.width;
            gameOverPanel.height = this.height;
            this.addChild(gameOverPanel);
            this.currentShowPanel = gameOverPanel;
        }
        else if(index == GameConfig.uiIndex.groupRankList){
             let goupRankListPanel = new GroupRankListPanel(data,index);
            goupRankListPanel.width = this.width;
            goupRankListPanel.height = this.height;
            this.addChild(goupRankListPanel);
            this.currentShowPanel = goupRankListPanel;
        }
        else if(index == GameConfig.uiIndex.game){
            let userInfo = data["mine"];
            if(this.currentShowPanel){
                let gamePanel = this.currentShowPanel as GamePanel;
                gamePanel.userInfo = userInfo;
                gamePanel.updateIndex = 0;
                gamePanel.updateDoneIndex = 0;
                gamePanel.updateInfo();
            }else{
                let gamePanel = new GamePanel(data,index);
                gamePanel.width = this.width;
                gamePanel.height = this.height;
                this.addChild(gamePanel);
                this.currentShowPanel = gamePanel;
            }
            
        }
    }
    /**
     * 展示下一页或上一页的数据
     * pageIndex:展示哪个页面
     * pageNum：-1、1对应上一页还是下一页
     */
    private changePage(pageIndex:number,pageNum:number)
    {
        if(pageIndex == GameConfig.uiIndex.rankListFromHome || pageIndex == GameConfig.uiIndex.rankListFromOver){
            if(this.currentShowPanel){
                let rankListPanel:RankListPanel = this.currentShowPanel as RankListPanel;
                rankListPanel.showNextPage(pageNum);
            }
        }
        else if(pageIndex == GameConfig.uiIndex.groupRankList){
            if(this.currentShowPanel){
                let groupRankListPanel:GroupRankListPanel = this.currentShowPanel as GroupRankListPanel;
                groupRankListPanel.showNextPage(pageNum);
            }
        }
    }
    //清除界面
    // 将共享数据域Main页面的所有子组件元素都删除
    private cancelGame(): void {
        if (!this.numChildren) return;
        for (let i = 0, l = this.numChildren; i < l; i++) {
            this.removeChildAt(0);
        }
    }
   
}
// 微信关系数据的获取
// 上传方法类似、开发者自行填写

declare namespace wx {

    /**
     * 监听消息
     */
    const onMessage: (callback: (data: { [key: string]: any }) => void) => void;
    /**
     * 拉取当前用户所有同玩好友的托管数据。该接口只可在开放数据域下使用
     * @param keyList 要拉取的 key 列表
     * @param success 接口调用成功的回调函数
     * @param fail 	接口调用失败的回调函数
     * @param complete 接口调用结束的回调函数（调用成功、失败都会执行）
     */
    const getFriendCloudStorage: (Object: {
        keyList?: string[],
        success?: (res: {
            data: UserGameData[]
        }) => void,
        fail?: (err: any) => void,
        complete?: () => void,
    }) => void;


    /**
     * 在小游戏是通过群分享卡片打开的情况下，可以通过调用该接口获取群同玩成员的游戏数据。该接口只可在开放数据域下使用。
     * @param shareTicket 群分享对应的 shareTicket
     * @param keyList 要拉取的 key 列表
     * @param success 接口调用成功的回调函数
     * @param fail 接口调用失败的回调函数
     * @param complete 接口调用结束的回调函数（调用成功、失败都会执行）
     */
    const getGroupCloudStorage: (Object: {
        shareTicket: string,
        keyList: string[],
        success?: (res: {
            data: UserGameData[]
        }) => void,
        fail?: (err?: any) => void,
        complete?: () => void,
    }) => void;
    /**
     * 保存分数信息等
     */
    const setUserCloudStorage: (Object: {
        KVDataList: KVData[],
        success?: (res: any) => void,
        fail?: (err: any) => void,
        complete?: () => void,
    }) => void;
    const setStorageSync: (key: string, data: Object | string) => void;
    /**
     * 用户数据
     */
    type UserGameData = {

        /** 用户的微信头像 url */
        avatarUrl: string,

        /** 用户的微信昵称 */
        nickName: string,

        /** 用户的 openId */
        openId: string,

        /**用户自定义数据 */
        KVList: KVData[]
    }

    type KVData = {
        key: string,
        value: string
    }
}